from arequests.AsyncRequest import AsyncRequest
from paser.CgvParser import CgvParser


class NextPageIterator:
    """
    自定义异步迭代器，迭代读取下一页的列表页
    """

    def __init__(self, page):
        self.next_page = page
        self.detail_page_list = []

    async def get_list_page(self):
        """
        请求列表页的url，并解析，把下一页的url和当前列表页的url保存
        :return:
        """
        # 请求列表页
        html = await AsyncRequest().aget(self.next_page)
        # 得到解析器,以后根据不同的条件得到不同的解析器
        parser = CgvParser()
        # 解析下一页
        next_page_url = parser.getNextPage(html)
        # 注意，此时得到的下一页为空时，当前页的详情页还有数据，所以不能直接返回None
        # 直接返回None会导致迭代器停止，引发详情页数据不能抓取
        if not next_page_url:
            # 没有下一页
            self.next_page = None
        else:
            self.next_page = next_page_url
        # 解析得到详情页
        self.detail_page_list = parser.getDetailPageList(html)
        return self

    def __aiter__(self):
        return self

    async def __anext__(self):
        # 如果下一页为空，停止迭代
        if self.next_page is None:
            raise StopAsyncIteration
        # 如果得到的列表页的值为空，停止迭代
        val = await self.get_list_page()
        if val is None:
            raise StopAsyncIteration
        return val
